/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package histograma;

import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;

/**
 *
 * @author ale
 */
public class GestorImagen {
    /*Esta clase se encargara de realizar todas las gestiones correspondientes
     * a la gfestion de imagen
     */
    
    //La imagen cargada
    private BufferedImage imgPanel;
    //La imagen en tonos de gris
    private BufferedImage imgPanelGrises;
    //La imagen en tonos de gris filtrada segun un umbral seleccionado
    private BufferedImage imgFiltrada;
    
    private boolean dibujarImagenUmbalizada=false;
    
    //Los respectivos Histogramas
    //Histograma de Color
    private int[][] histColor = new int[3][256];
    //Histograma tonos de gris
    private int[] histGrises = new int[256];
    
    /**
     * Metodo para cargar una BufferedImage cuya direccion se pasa por parametro
     * @param direccion absoluta del archivo seleccionado
     */   
    public void cargarImagen(String direccion)
    {
        try
        {
            //ImageIO es estatica, entonces no se inicializa con el operador new
            this.imgPanel=null;
            this.imgPanel = ImageIO.read(new File(direccion));
            this.setImgPanelGrises();
        }
        catch (IOException e)
        {
        }
    }
        
    /**
     * @return the imgPanel
     */
    public BufferedImage getImgPanel() {
        return imgPanel;
    }
    
    /**
     * Se solicita informacion sobre un pixel en particular
     * @param x indice x
     * @param y indice y
     * @return mensaje con los colores RGB pertenecientes al pixel correpondiente al indice [x,y]
     */
    public String getInfoPixel(int x, int y)
    {
        String mensaje = "Sin datos";
                int pixel;
        int rojo;
        int verde;
        int azul;
        if(this.getImgPanel()!=null)
        {
            pixel=this.getImgPanel().getRGB(x, y);
            azul =   pixel & 0x000000FF;
            verde = (pixel & 0x0000FF00) >> 8;
            rojo =  (pixel & 0x00FF0000) >> 16;
            mensaje = "[B:"+azul+";G:"+verde+";R:"+rojo+"]";
        }
        return mensaje;
    }

    public String getInfoPixelGris(int x, int y)
    {
        String mensaje = "Sin datos";
                int pixel;
        int rojo;
        int verde;
        int azul;
        if(this.getImgPanel()!=null)
        {
            pixel=this.getImgPanel().getRGB(x, y);
            azul =   pixel & 0x000000FF;
            verde = (pixel & 0x0000FF00) >> 8;
            rojo =  (pixel & 0x00FF0000) >> 16;
            int gris = (int) (.299 * rojo + .587 * verde + .114 * azul);
            mensaje = String.valueOf(gris);
        }
        return mensaje;
    }
    
    /**
     * @return the imgPanelGrises
     */
    public BufferedImage getImgPanelGrises() {
        return imgPanelGrises;
    }

    /**
     * @param Se creará ina imagen igual a la imagen original pero en tonos de grises
     */
    public void setImgPanelGrises() {
        //Se crea un nuevo BufferedImage en tonos de gris
        this.imgPanelGrises = new BufferedImage(
                                                this.getImgPanel().getWidth(),
                                                this.getImgPanel().getHeight(),
                                                BufferedImage.TYPE_BYTE_GRAY
                                                );
        //se obtiene la instancia Graphics2D sobre el nuevo BufferedImage en tonos de gris
        Graphics2D graficadorGrises = this.getImgPanelGrises().createGraphics();
        //Se grafica
        graficadorGrises.drawImage  (
                                    this.getImgPanel(),
                                    0,
                                    0,
                                    this.getImgPanel().getWidth(),
                                    this.getImgPanel().getHeight(),
                                    null
                                    );
        
    }
    
    /**
     * Se creará la imagen imbralizada según el valor de umbral seleccionado
     * @param umbral 
     */
    public void CrearImagenUmbralizada(int umbral)
    {
        this.setImgFiltrada(null);
        this.setImgFiltrada(new BufferedImage   (
                                                this.getImgPanel().getWidth(),
                                                this.getImgPanel().getHeight(),
                                                BufferedImage.TYPE_INT_RGB
                                                ));
        int gris;
        int ngris;
        for (int y = 0; y < this.getImgPanelGrises().getHeight(); y++) {  
            for (int x = 0; x < this.getImgPanelGrises().getWidth(); x++) {            
                int c = this.getImgPanelGrises().getRGB(x,y);         
                int  red = (  c & 0x00FF0000) >> 16;  
                int  green = (c & 0x0000FF00) >> 8;  
                int  blue =   c & 0x000000FF;
                gris = (int) (.299 * red + .587 * green + .114 * blue);
                
                //aplicando el umbral
                if(gris< umbral)
                    ngris=0xffffffff;
                else 
                    ngris=0;
                //pintando el valor
                this.getImgFiltrada().setRGB(x, y, ngris);
                //System.out.println("Gris: "+gris+" Umbralado: "+ngris);
            }
        }
        this.setDibujarImagenUmbalizada(true);
    }
    
    
    
    /**
     * Se inicializará el vector de grises y se calcularán los valores correspondientes
     */
    public void setVectorHistogramaGrises()
    {
        //inicializa el vector de grises
        for(int i=0;i<this.histGrises.length;i++)
        {
            this.histGrises[i]=0;
        }
        
        //calcula el vector de grises
        for (int y = 0; y < this.getImgPanel().getHeight(); y++) {  
            for (int x = 0; x < this.getImgPanel().getWidth(); x++) {            
                int c = this.getImgPanelGrises().getRGB(x,y);         
                int  red = (  c & 0x00FF0000) >> 16;  
                int  green = (c & 0x0000FF00) >> 8;  
                int  blue =   c & 0x000000FF;
                int gris = (int) (.299 * red + .587 * green + .114 * blue);
                this.histGrises[gris]++;
            }
        }
                
        /*for(int i=0;i<this.histGrises.length;i++)
        {
            System.out.println("Indice: "+i+"; Valor: "+this.histGrises[i]);
        }*/
        
    }
    
    public int[] getVectorHistogramaGrises()
    {
        return this.histGrises;
    }
    
    public int[][] getMatrizHistogramaColor()
    {
        return this.histColor;
    }
    
    /**
     * Se genera la matiz para el histograma de color
     */
    public void setMatrizHistogramaColor()
    {
        //inicializa el vector de colores

        for(int y=0;y<256;y++)
        {
            this.histColor[0][y]=0;
            this.histColor[1][y]=0;
            this.histColor[2][y]=0;
        }
        
        //calcula el vector de colores
        for (int y = 0; y < this.getImgPanel().getHeight(); y++) 
        {  
            for (int x = 0; x < this.getImgPanel().getWidth(); x++) 
            {
                int c = this.getImgPanel().getRGB(x,y);         
                
                this.histColor[0][(c & 0x00FF0000) >> 16]++;
                this.histColor[1][(c & 0x0000FF00) >> 8]++;
                this.histColor[2][(c & 0x000000FF)]++;
            }
        }
        
        /*for(int y=0;y<256;y++)
        {
            System.out.println(y+"[ R: "+this.histColor[0][y]+" ; G: "+this.histColor[1][y]+" ; B "+this.histColor[2][y]+" ]" );
        }*/
    }

    /**
     * @return the imgFiltrada
     */
    public BufferedImage getImgFiltrada() {
        return imgFiltrada;
    }

    /**
     * @param imgFiltrada the imgFiltrada to set
     */
    public void setImgFiltrada(BufferedImage imgFiltrada) {
        this.imgFiltrada = imgFiltrada;
    }

    /**
     * @return the dibujarImagenUmbalizada
     */
    public boolean isDibujarImagenUmbalizada() {
        return dibujarImagenUmbalizada;
    }

    /**
     * @param dibujarImagenUmbalizada the dibujarImagenUmbalizada to set
     */
    public void setDibujarImagenUmbalizada(boolean dibujarImagenUmbalizada) {
        this.dibujarImagenUmbalizada = dibujarImagenUmbalizada;
    }
}
